﻿using System;
using System.Collections;
using System.Diagnostics;
using System.Timers;
using HueLampStatusDetector.Status;
using Microsoft.Office.Interop.Outlook;
using Exception = System.Exception;

namespace HueLampStatusDetector.StatusChecker
{
    public class OutlookStatusChecker : IStatusChecker
    {
        private StatusType _oldStatusType = StatusType.Free;
        private object _padLock = new object();

        public OutlookStatusChecker()
        {
            Timer timer = new Timer();
            timer.Interval = TimeSpan.FromSeconds(1).TotalMilliseconds;
            timer.Elapsed += OnTimeElapsed;
            timer.Start();
        }

        public ChangeStatus ChangeStatus { get; set; }

        private void OnTimeElapsed(object sender, ElapsedEventArgs e)
        {
            CheckStatus();
        }

        private void CheckStatus()
        {
            try
            {
                Application outlookApp = new Application();
                NameSpace nameSpace = outlookApp.GetNamespace("MAPI");

                MAPIFolder calendarFolder = nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
                Items calendarItems = calendarFolder.Items;
                calendarItems.IncludeRecurrences = true;
                calendarItems.Sort("[Start]", Type.Missing);
                DateTime now = DateTime.Now;
                DateTime todayStart = new DateTime(now.Year, now.Month, now.Day, 00, 00, 01);
                DateTime todayEnds = new DateTime(now.Year, now.Month, now.Day, 23, 59, 58);

                Items currentCalendarItems = calendarItems.Restrict(
                            string.Format(@"[Start] < ""{0}"" AND [End] > ""{1}"" AND [Start] >=""{2}"" AND [End] < ""{3}"" ",
                                    now.ToString("g"), now.AddMinutes(1).ToString("g"),
                                    todayStart.ToString("g"), todayEnds.ToString("g")));

                IEnumerator itemsEnumerator = currentCalendarItems.GetEnumerator();
                itemsEnumerator.MoveNext();

                StatusType statusType = itemsEnumerator.Current == null ? StatusType.Free : StatusType.Busy;

                lock (_padLock)
                {
                    if (statusType == _oldStatusType)
                    {
                        return;
                    }

                    Trace.TraceInformation("Outlook statusType: {0}", statusType);
                    SendNotification(statusType);
                    _oldStatusType = statusType;
                }
            }
            catch (Exception err)
            {
                Trace.TraceError(err.ToString());
            }
        }

        private void SendNotification(StatusType statusType)
        {
            if (ChangeStatus != null)
            {
                ChangeStatus.Invoke(this, new ChangeStatusEventArgs(statusType));
            }
        }


    }
}